/**   
 * 文件名：BeanUtil.java</br>
 * 描述： </br>
 * 开发人员：汪浩博 </br>
 * 创建时间： 2016-5-20
 */ 

package com.base.util;

import java.lang.reflect.Method;

/** 
 * 类名: BeanUtil</br> 
 * 包名：com.base.util </br> 
 * 描述: </br>
 * 发布版本号：</br>
 * 开发人员： 汪浩博</br>
 * 创建时间： 2016-5-20 
 */

public class BeanUtil {
	/**
	 * 属性拷贝
	 * 将bean对象拷贝到dbInstance对象
	 * @param dbInstance
	 *            ： 最终要获取的对象（VO）
	 * @param bean
	 *            ：原数据对象
	 * @return 以数据库为基础的合并对象
	 */
	@SuppressWarnings("rawtypes")
	public static Object copyProperties(Object dbInstance, Object bean) {
		
		Class dbclass = dbInstance.getClass();
		Class klass = bean.getClass();
		Method method;
		Object obj = null;
		String name;
		String key;

		/**
		 * 遍历bean类的方法
		 */
		Method[] methods = klass.getMethods();
		Method[] dbmethods = dbclass.getMethods();
		for (int i = 0; i < methods.length; i++) {

			method = methods[i];
			name = method.getName();
			key = "";

			/**
			 * 通过getXxx, isXxx找到bean的成员属性
			 */
			if (name.startsWith("get") && !name.equals("getClass")) {
				key = name.substring(3);
			} else if (name.startsWith("is")) {
				key = name.substring(2);
			} else {
				continue;
			}

			/**
			 * 获取此成员属性的值，保存为obj
			 */
			try {
				obj = method.invoke(bean, null);
			} catch (Exception e) {
			}

			/**
			 * 如果obj不为空，并且不是HashSet类型，则尝试从bean中获取值，赋值给dbInstance
			 */
			if (obj != null
					&& !obj.getClass().getName().equals("java.util.HashSet")) {
				try {
					for (int j = 0; j < dbmethods.length; j++) {
						if (dbmethods[j].getName().equals("set" + key)) {
							Object[] objs = new Object[1];
							objs[0] = obj;
							dbmethods[j].invoke(dbInstance, objs);
							break;
						}
					}
				} catch (Exception e) {
					key = name.substring(3);
					/**
					 * 查找该obj的set方法，将obj赋值给父bean
					 */
					for (int j = 0; j < methods.length; j++) {
						if (methods[j].getName().equals("set" + key)) {
							Object[] objs = new Object[1];
							objs[0] = obj;
							try {
								methods[j].invoke(dbInstance, objs);
							} catch (Exception e1) {
							}
							break;
						}
					}
				}
			}
		}

		return dbInstance;
	}
}
